﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.ComponentModel;
using System.Text;
using System.Windows.Forms;
//librerias especiales para la BD
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
using System.Data.SqlTypes;

namespace CityGames
{
    public class CADValoracion
    {
        static private string cadConexion = System.Configuration.ConfigurationManager.ConnectionStrings["CityGames.Properties.Settings.BDCityGamesConnectionString"].ConnectionString;

        /************************************************** Funciones de Marcos **************************************************/

        public int ObtenerValoracionDeSocio(string DNISocio, string nombreJuego, string plataformaJuego)
        {
            int resultado = 0;
            string select = "";

            SqlConnection conexion = null;
            SqlCommand command = null;
            SqlDataReader dr = null;

            try
            {
                conexion = new SqlConnection(cadConexion);
                conexion.Open();

                select = "SELECT Valoracion FROM Valoraciones WHERE (DNISocio = @dni) AND (NombreJuego = @nombreJuego) AND (PlataformaJuego = @plataformaJuego)";

                command = new SqlCommand(select, conexion);

                command.Parameters.Add("@dni", SqlDbType.VarChar, 9);
                command.Parameters["@dni"].Value = DNISocio;
                command.Parameters.Add("@nombreJuego", SqlDbType.VarChar, 50);
                command.Parameters["@nombreJuego"].Value = nombreJuego;
                command.Parameters.Add("@plataformaJuego", SqlDbType.VarChar, 20);
                command.Parameters["@plataformaJuego"].Value = plataformaJuego;

                dr = command.ExecuteReader();

                if (dr.Read())
                    resultado = int.Parse(dr["Valoracion"].ToString());
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (conexion != null)
                    conexion.Close();
            }

            return resultado;
        }

        public int ObtenerNumeroDeValoraciones(string nombreJuego, string plataformaJuego)
        {
            int resultado = 0;
            string select = "";

            SqlConnection conexion = null;
            SqlCommand command = null;
            SqlDataReader dr = null;

            try
            {
                conexion = new SqlConnection(cadConexion);
                conexion.Open();

                select = "SELECT COUNT(*) AS NumeroValoraciones FROM Valoraciones WHERE (NombreJuego = @nombreJuego) AND (PlataformaJuego = @plataformaJuego)";

                command = new SqlCommand(select, conexion);

                command.Parameters.Add("@nombreJuego", SqlDbType.VarChar, 50);
                command.Parameters["@nombreJuego"].Value = nombreJuego;
                command.Parameters.Add("@plataformaJuego", SqlDbType.VarChar, 20);
                command.Parameters["@plataformaJuego"].Value = plataformaJuego;

                dr = command.ExecuteReader();

                if (dr.Read())
                    resultado = int.Parse(dr["NumeroValoraciones"].ToString());
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (conexion != null)
                    conexion.Close();
            }

            return resultado;
        }

        public decimal ObtenerValoracionMediaUsuarios(string nombreJuego, string plataformaJuego)
        {
            decimal resultado = 0;
            string numeroValoraciones = "";
            string totalValoraciones = "";
            string select = "";

            SqlConnection conexion = null;
            SqlCommand command = null;
            SqlDataReader dr = null;

            try
            {
                conexion = new SqlConnection(cadConexion);
                conexion.Open();

                select += "SELECT COUNT(*) AS NumeroValoraciones, SUM(Valoracion) AS TotalValoraciones FROM Valoraciones WHERE (NombreJuego = @nombreJuego) AND (PlataformaJuego = @plataformaJuego)";

                command = new SqlCommand(select, conexion);

                command.Parameters.Add("@nombreJuego", SqlDbType.VarChar, 50);
                command.Parameters["@nombreJuego"].Value = nombreJuego;
                command.Parameters.Add("@plataformaJuego", SqlDbType.VarChar, 20);
                command.Parameters["@plataformaJuego"].Value = plataformaJuego;

                dr = command.ExecuteReader();

                if (dr.Read())
                {
                    numeroValoraciones = dr["NumeroValoraciones"].ToString();
                    totalValoraciones = dr["TotalValoraciones"].ToString();
                    if (totalValoraciones != "" && numeroValoraciones != "")
                        resultado = decimal.Parse(totalValoraciones) / int.Parse(numeroValoraciones);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (conexion != null)
                    conexion.Close();
            }

            return resultado;
        }

        public bool InsertarValoracion(string nombreJuego, string plataformaJuego, string dniSocio, int puntuacion)
        {
            bool resultado = false;
            string insert = "";

            SqlConnection conexion = null;
            SqlCommand command = null;

            try
            {
                if (!ExisteValoracion(nombreJuego, plataformaJuego, dniSocio))
                {
                    conexion = new SqlConnection(cadConexion);
                    conexion.Open();

                    insert = "INSERT INTO Valoraciones (NombreJuego, PlataformaJuego, DNISocio, Valoracion) ";
                    insert += "VALUES (@nombreJuego, @plataformaJuego, @dniSocio, @valoracion)";

                    command = new SqlCommand(insert, conexion);
                    command.Parameters.Add("@nombreJuego", SqlDbType.VarChar, 50);
                    command.Parameters["@nombreJuego"].Value = nombreJuego;
                    command.Parameters.Add("@plataformaJuego", SqlDbType.VarChar, 20);
                    command.Parameters["@plataformaJuego"].Value = plataformaJuego;
                    command.Parameters.Add("@dniSocio", SqlDbType.VarChar, 9);
                    command.Parameters["@dniSocio"].Value = dniSocio;
                    command.Parameters.Add("@valoracion", SqlDbType.Int);
                    command.Parameters["@valoracion"].Value = puntuacion;

                    command.ExecuteNonQuery();

                    resultado = true;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (conexion != null)
                    conexion.Close();
            }

            return resultado;
        }

        private bool ExisteValoracion(string nombreJuego, string plataformaJuego, string dniSocio)
        {
            bool resultado = false;
            string select = "";

            SqlConnection conexion = null;
            SqlCommand command = null;
            SqlDataReader dr = null;

            try
            {
                conexion = new SqlConnection(cadConexion);
                conexion.Open();

                select = "SELECT * FROM Valoraciones ";
                select += "WHERE (NombreJuego = @nombreJuego) AND (PlataformaJuego = @plataformaJuego) AND (DNISocio = @dniSocio)";

                command = new SqlCommand(select, conexion);
                command.Parameters.Add("@nombreJuego", SqlDbType.VarChar, 50);
                command.Parameters["@nombreJuego"].Value = nombreJuego;
                command.Parameters.Add("@plataformaJuego", SqlDbType.VarChar, 20);
                command.Parameters["@plataformaJuego"].Value = plataformaJuego;
                command.Parameters.Add("@dniSocio", SqlDbType.VarChar, 9);
                command.Parameters["@dniSocio"].Value = dniSocio;

                dr = command.ExecuteReader();

                if(dr.Read())
                    resultado = true;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (conexion != null)
                    conexion.Close();
            }

            return resultado;
        }

        /************************************************** Fin Funciones de Marcos **************************************************/
    }
}